import axios from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { useUserStore } from '../stores/user';
import { router } from '../router'; // 导入路由实例

const service = axios.create({
  baseURL: '/', // 基础URL，会根据实际后端地址配置
  timeout: 60000, // 增加请求超时时间到60秒，以更好地适应AI处理时间
});

// 是否正在显示登录过期弹窗
let isShowingAuthDialog = false;

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore();
    console.log('请求拦截器 - 当前token状态:', {
      hasToken: !!userStore.token,
      tokenLength: userStore.token ? userStore.token.length : 0,
      url: config.url
    });
    
    if (userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`;
    } else {
      // 如果没有token，尝试从localStorage重新获取
      const storedToken = localStorage.getItem('token');
      if (storedToken) {
        console.log('从localStorage重新获取token');
        userStore.setToken(storedToken);
        config.headers.Authorization = `Bearer ${storedToken}`;
      } else {
        console.warn('请求时未找到token，可能导致认证失败');
      }
    }
    return config;
  },
  (error) => {
    console.log('请求拦截器错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 如果是二进制数据，直接返回response
    if (response.config.responseType === 'blob') {
      return response;
    }

    const res = response.data;
    console.log('响应拦截器 - 响应数据:', {
      code: res.code,
      message: res.message,
      url: response.config.url
    });
    
    if (res.code !== 200) {
      // 特殊处理认证相关错误（401或特定消息）
      if (res.code === 401 || res.message === '未登录或登录已过期') {
        handleAuthError();
        return Promise.reject(new Error('AUTH_ERROR'));
      }
      
      ElMessage({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000,
      });
      return Promise.reject(new Error(res.message || 'Error'));
    } else {
      return res;
    }
  },
  (error) => {
    console.log('响应拦截器错误:', error); // for debug
    
    // 如果是认证错误，统一处理
    if (error.message === 'AUTH_ERROR' || 
        (error.response && error.response.status === 401)) {
      handleAuthError();
      return Promise.reject(error);
    }
    
    // 尝试从服务器响应中获取具体的错误消息
    let errorMessage = '请求失败';
    if (error.response) {
      // 服务器返回了错误状态码
      if (error.response.data && error.response.data.message) {
        // 特殊处理认证相关错误
        if (error.response.data.message === '未登录或登录已过期') {
          handleAuthError();
          return Promise.reject(error);
        }
        errorMessage = error.response.data.message;
      } else {
        errorMessage = `请求失败: ${error.response.status}`;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      // 特别处理超时错误
      if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
        errorMessage = '请求超时，请稍后重试';
      } else {
        errorMessage = '服务器无响应，请检查网络或后端服务';
      }
    } else {
      // 在设置请求时发生了其他错误
      errorMessage = error.message || '请求失败';
    }
    
    ElMessage({
      message: errorMessage,
      type: 'error',
      duration: 5 * 1000,
    });
    return Promise.reject(error);
  }
);

// 处理认证错误的函数
const handleAuthError = () => {
  // 如果已经在显示弹窗，直接返回，避免重复弹窗
  if (isShowingAuthDialog) {
    return;
  }
  
  // 标记正在显示弹窗
  isShowingAuthDialog = true;
  
  const userStore = useUserStore();
  
  // 清除用户信息
  userStore.clearUser();
  
  // 显示过期提示
  ElMessageBox.alert('登录已过期，请重新登录', '提示', {
    confirmButtonText: '确定',
    type: 'warning',
    showClose: false, // 不显示关闭按钮，强制用户点击确定
    callback: () => {
      // 重置弹窗标记
      isShowingAuthDialog = false;
      
      // 跳转到登录页并刷新页面，确保所有状态清除
      if (router) {
        router.push('/login').then(() => {
          // 跳转后刷新页面，确保所有组件重新渲染
          window.location.reload();
        });
      } else {
        window.location.href = '/login';
      }
    }
  });
};

export default service;